Differential expression for Cut vs Uncut

This is the differential expression analysis report for the comparison of gene expression in Cut versus the gene expression in Uncut.

Data is processed from transcript quantifications derived from Salmon.

Files are normalized and compared between conditions using DESeq2. For more information on the analysis you can review the code in this document and visit our training material at https://rockefelleruniversity.github.io

outdir <- file.path(basdir,
                    paste0(conditionA,
                                "_vs_",
                                conditionB,
                           "_Reports")
                    )
dir.create(outdir,showWarnings = FALSE,recursive = TRUE)


files <- dir(countDir,
             recursive = TRUE,
             pattern="quant.sf",
             full.names = TRUE)
tx2gene <- read.delim(tx2geneFile,sep=",")
tximported <- tximport(files,type = "salmon",tx2gene = tx2gene,txOut = FALSE)
colData <- data.frame(Sample_Unique=gsub("_salmon","",basename(dirname(files))),
                      Group=gsub("_salmon","",basename(dirname(files))) %>% gsub("_.*","",.),
                      salmonCounts=files) %>%
  column_to_rownames("Sample_Unique")


colnames(tximported$counts) <- gsub("_salmon","",basename(dirname(files)))
colnames(tximported$abundance) <- gsub("_salmon","",basename(dirname(files)))

The Input files

The input files from Salmon are shown in Table 1 alongside the sample names and any group information.

inputTable <- data.frame(files=file.path(basename(dirname(files)),
                         basename(files)),
                         colData) %>% set_rownames(gsub("_salmon","",basename(dirname(files))))
inputTableforDE <- data.frame(files=files,
                         colData) %>% set_rownames(gsub("_salmon","",basename(dirname(files))))
DT::datatable(inputTable)

Additional files required for the analysis of differential isoform abundance are shown in Table 2.

DT::datatable(t(data.frame(TranscriptToGene=tx2geneFile,
GTF=pathToGTF,
GO=GOsets)) %>% as.data.frame %>% rownames_to_column %>% set_colnames(c("FileType","FileName")) %>% mutate(FileName=basename(FileName)))

Comparison of Gene expression

Data is subset to the conditions of interest - Cut and Uncut and imported into DESeq2.

Contents of differential expression report directory

The output files

The report directory contains output from a differential analysis including -

  • The Reports - PDF, HTML and interactive HTML reports.

  • Differential Expression tables - Tables of significance and extent of change for Cut minus Uncut.

    • Excel - Cut_vs_Uncut.xlsx
    • CSV - Cut_vs_Uncut.csv
    • In HTML pages (selfcontained) - Cut_vs_Uncut.html
  • Figures - The Figures directory contains all images seen in reports.

The reports

Code for analysis

All code used in this report can be found by clicking code buttons on side of reports.

  dds <- DESeqDataSetFromTximport(tximported,colData = colData ,design = ~Group)
  dds <- dds[,colData(dds)$Group %in% c(conditionA,conditionB)]
  colData(dds)$Group <- factor(as.character(colData(dds)$Group))
  dds <- DESeq(dds)
  normExprs <- rlog(dds)
DEtable <- results(dds,contrast=c("Group",conditionA,conditionB)) %>% 
                as.data.frame %>% 
                rownames_to_column %>% 
                filter(!is.na(padj)) %>% 
                arrange(pvalue) %>% 
                arrange(desc(abs(stat)))

# save(dds,file="~/Downloads/Heintz/dds.RData")
normCountToExport <- sapply(levels(colData(dds)$Group),function(x)rowMeans(counts(dds,normalized=TRUE)[,colData(dds)$Group %in% x,drop=FALSE]))
colnames(normCountToExport) <- paste0(colnames(normCountToExport),"_NormCounts")
normCountToExport <- data.frame(IDs=rownames(dds),
                                normCountToExport)

normCountToExport2 <- lapply(levels(colData(dds)$Group),function(x)counts(dds,normalized=TRUE)[,colData(dds)$Group %in% x,drop=FALSE]) %>% do.call(cbind,.)
colnames(normCountToExport2) <- paste0(colnames(normCountToExport2),"_NormCounts")
normCountToExport2 <- data.frame(IDs=rownames(dds),
                                normCountToExport2)

# normCountToExport <- merge(annoS,normCountToExport,by=1,all=TRUE)
# write.table(normCountToExport,file=file.path(outdir,paste0(ComparisonName,"_CountsPerGroup.csv")),sep=",",row.names = FALSE)
DEtable <- merge(DEtable,normCountToExport,by=1,all.x=TRUE,all.y=FALSE) %>% 
           merge(normCountToExport2,by=1,all.x=TRUE,all.y=FALSE) %>% 
            arrange(desc(abs(stat)))
require(org.Dr.eg.db)
DEtableanno <- AnnotationDbi::select(x = org.Dr.eg.db,keys = as.character(DEtable[,1]),keytype = "ENSEMBL",columns = c("ENSEMBL","SYMBOL"))
DEtable <- merge(DEtableanno,DEtable,by=1,all.x=TRUE,all.y=FALSE)  %>% 
            arrange(desc(abs(stat)))
colnames(DEtable)[1] <- "rowname"

Sample heatmap

The Heatmap in Figure 1 shows an overview of the correlation between gene expression profiles for the samples under investigation. Samples with greater similarity in gene expression profiles will be clustered closer together in the heatmap and have smaller values for between samples distances (indicated by darker blue).

require(pheatmap)
sampleDists <- dist(t(assay(normExprs)))

sampleDistMatrix <- as.matrix(sampleDists)
rownames(sampleDistMatrix) <- colData(normExprs)$Group
colnames(sampleDistMatrix) <- colnames(normExprs)
colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255)
# png(paste0(ComparisonName,"_sampleDist.png"))
pheatmap(sampleDistMatrix,
         clustering_distance_rows=sampleDists,
         clustering_distance_cols=sampleDists,
         annotation_col=as.data.frame(colData(normExprs)) %>% 
           dplyr::select(!contains("sizeFactor")) %>% dplyr::select(Group),
         col=colors) 

# dev.off()
graphics.off()

Principal Component Analysis - PCA

The Principal Component Analysis in Figure 2 displays the separation of samples along the major sources of variation in the data.

p <- plotPCA(normExprs,ntop=500,intgroup="Group")+theme_bw()+ggtitle(paste0("PCA for top500 most variable genes in ",conditionA," and ",conditionB," samples"))

Differential expression analysis

In this section we compare the log2 expression of genes in Cut minus log2 expression in Uncut using DESeq2.

Table 2 shows the results of this comparison with columns

  • IDs - Entrez IDs for genes
  • Symbols - Symbols for genes
  • baseMean - Average normalized counts for gene across all samples.
  • log2FoldChange - Log2 mean difference in expression for Cut minus Uncut.
  • lfcSE - Standard error of log2FoldChange estimate
  • stat - Wald statistic for log2FoldChange and lfcSE.
  • pvalue - Significance of log2FoldChange for Cut minus Uncut.
  • padj - Adjusted pvalue for log2FoldChange for Cut minus Uncut to account for the multiple comparisons performed in testing differential expression across all genes).
  • Cut_NormCounts - Normalised counts in Cut.
  • Uncut_NormCounts - Normalised counts in Uncut.

Table 3 shows the total number of differentialy expressed genes between conditions under user specified cut-offs.

logFC_Down <- -1
logFC_Up <- 1
padjCutOff <- 0.05
l <- data.frame(Comparison=c(paste0("Up_In_",conditionA," vs ",conditionB),
                             paste0("Up_In_",conditionA," vs ",conditionB," (logFC>",logFC_Up,")"),
                             paste0("Up_In_",conditionB," vs ",conditionA),
                             paste0("Up_In_",conditionB," vs ",conditionA," (logFC>",logFC_Down*-1,")")),
    NumberOfGenes=c(sum(DEtable$padj < padjCutOff & !is.na(DEtable$padj) & DEtable$log2FoldChange > 0),
    sum(DEtable$padj < padjCutOff & !is.na(DEtable$padj) & DEtable$log2FoldChange > logFC_Up),
    sum(DEtable$padj < padjCutOff & !is.na(DEtable$padj) & DEtable$log2FoldChange < 0),
    sum(DEtable$padj < padjCutOff & !is.na(DEtable$padj) & DEtable$log2FoldChange < logFC_Down)
  ))

DT::datatable(l,caption = paste0("Table 3 - Number of genes passing cutoffs (padj <",padjCutOff,")"))
DEtable %>% 
   filter((padj < padjCutOff & !is.na(padj)) & ((DEtable$log2FoldChange < logFC_Down)|(DEtable$log2FoldChange > logFC_Up))) %>% 
   rio::export(file = file.path(outdir,paste0(ComparisonName,"_DGEanalysis.xlsx")))

DEtable %>% 
   filter((padj < padjCutOff & !is.na(padj)) & ((DEtable$log2FoldChange < logFC_Down)|(DEtable$log2FoldChange > logFC_Up))) %>% 
   write.table(file = file.path(outdir,paste0(ComparisonName,"_DGEanalysis.csv")),sep=",",row.names = FALSE)

DEtable %>% 
   write.table(file = file.path(outdir,paste0(ComparisonName,"_DGEanalysisUnffiltered.csv")),sep=",",row.names = FALSE)

Differential expression plots.

In this section we review two quality control plots to assess the expression level, direction and degree of change between Cut and Uncut, as well as significance of this change across all measured genes.

Volcano plot

The Volcano plot in Figure 3 shows the log2 fold change for Cut minus Uncut along the X-axis and the significance of change (the absolute Wald statistic) on the Y-axis.

ComparisonName <- paste0(conditionA,"_minus_",conditionB)    



toPlot <- c(as.vector(DEtable[order(DEtable$stat),"rowname"])[1:5],
            as.vector(DEtable[order(DEtable$stat,decreasing = TRUE),"rowname"])[1:5])

# selectedUp <- c("MEST")
# selectedDown <- c("A2M","HIST1H2BK")

DEtable$Cut_Off <- factor(ifelse((DEtable$padj < padjCutOff & !is.na(DEtable$padj)) & ((DEtable$log2FoldChange < logFC_Down)|(DEtable$log2FoldChange > logFC_Up)),"Pass",
                             "Fail"),levels = c("Fail","Pass"))


p <- ggplot(DEtable,aes(x=log2FoldChange,y=abs(stat)))+
  geom_point(aes(alpha=Cut_Off))+
  theme_bw()+
  ggtitle(ComparisonName)


p2 <- p+geom_label_repel(data = DEtable[DEtable$rowname %in% toPlot  & DEtable$padj <0.05,], 
                        aes(label=rowname), hjust=0, vjust=0, size=5)+
  xlim(c(-10,10))+
  scale_alpha_manual(values=c(Fail=0.1,Pass=1))

MA plot

The MA plot in Figure 4 shows the log2 fold change for Cut minus Uncut along the Y-axis and the log2 baseMean across all samples on the X-axis.

p <- ggplot(DEtable,aes(x=log2FoldChange,y=log2(baseMean)))+geom_point(aes(alpha=Cut_Off))+theme_bw()+ggtitle(ComparisonName)
p2 <- p+geom_label_repel(data = DEtable[DEtable$rowname %in% toPlot  & DEtable$padj <0.05,],aes(label=rowname),hjust=0,vjust=0,size=5)+xlim(c(-10,10))+scale_alpha_manual(values=c(Fail=0.1,Pass=1))+coord_flip()

Sample and Gene Heatmap

Figure 5 shows the per gene median scaled log2 expression values for significantly differential genes between Cut and Uncut.

sigGenes <- DEtable %>% 
                filter((padj < padjCutOff & !is.na(padj)) & ((DEtable$log2FoldChange < logFC_Down)|(DEtable$log2FoldChange > logFC_Up))) %>% 
                dplyr::pull(rowname)
if(length(sigGenes) > 2){
  exprsForHM <- assay(normExprs)
  exprsForHM <- exprsForHM[rownames(exprsForHM) %in% sigGenes,]
  
  
  pheatmap(t(scale(t(exprsForHM),center = TRUE,scale = FALSE)),
           clustering_distance_rows="correlation",
           clustering_distance_cols="correlation",
           annotation_col=as.data.frame(colData(normExprs))  %>% dplyr::select(!contains("sizeFactor"))  %>% dplyr::select(Group),
           scale="none",show_rownames = FALSE)
}

Figure 6 shows the per gene Z-score scaled expression values for significantly differential genes between Cut and Uncut. Z-score is the number of standard deviations from the mean, so will reveal patterns in gene expression, but not show absolute values of gene expression.

sigGenes <- DEtable %>% 
                filter((padj < padjCutOff & !is.na(padj)) & ((DEtable$log2FoldChange < logFC_Down)|(DEtable$log2FoldChange > logFC_Up))) %>% 
                dplyr::pull(rowname)
if(length(sigGenes) > 2){
  exprsForHM <- assay(normExprs)
  exprsForHM <- exprsForHM[rownames(exprsForHM) %in% sigGenes,]
  
  pheatmap(exprsForHM,
           clustering_distance_rows="correlation",
           clustering_distance_cols="correlation",
           annotation_col=as.data.frame(colData(normExprs))  %>% dplyr::select(!contains("sizeFactor"))  %>% dplyr::select(Group),
           scale="row",show_rownames = FALSE)
}

GSEA analysis of GO terms.

Following the tests of differential expression, we now perform a gene set enrichment analysis using the fgsea package to identify GO genesets which are upregulated or downregulated in comparison Cut minus Uncut.

Table 4 and figure 6 show the ranking of the differentially regulated gene sets and the gene set netowrk plots for top 40 differentially regulated by p-value.

For information on using fgsea, visit the package the package home page or our course material here

require(fgsea)
require(dplyr)
require(tibble)
require(magrittr)
require(GO.db)
require(clusterProfiler)
# GOmap <- "~/Desktop/Projects/heintz/monkeyGORefs/MfascIDToGO.txt"
# # DEtable <- read.delim("~/Desktop/Projects/brc/renvTest/AnotherTest2/DE_Genes/salmon/Group_shPTBP1_53_minus_TamDEG.xls")
# DEtable <- read.delim("/Volumes/MRCbackup/eric_mFasc/DE_Genes/Group_contra_ctx_input_minus_contra_ctx_IPDEG.xls")
# annoS <- read.delim("/Volumes/MRCbackup/eric_mFasc/MfascicularisIDtoSymbolforPipe.txt",sep="\t")

temp <- read.delim(GOsets,row.names = NULL)
# temp <- merge(temp,annoS,by=1,all=TRUE)

# temp <- temp[!temp$GOIDs == "" & !is.na(temp$Symbols),]
temp <- temp[!temp$Category == "",] %>%
  dplyr::select(TERM=Category,GENE=Genes)

# mttr <- split(as.vector(temp$Genes), as.vector(temp$Category))
# # mttr <- split(as.vector(temp$Symbols), as.vector(temp$GOIDs))
#
# mttr <- lapply(mttr,unique)
statTest <- DEtable %>% filter((!is.na(padj))) %>% dplyr::pull(stat)

# names(statTest) <- DEtable %>% filter((!is.na(padj))) %>% .[,2]
names(statTest) <- DEtable %>% filter((!is.na(padj))) %>% .[,1]

re <- as.data.frame(GO.db::GOTERM)[,-1] %>%
  dplyr::select(go_id,Term) %>%
  filter(!duplicated(go_id))

gsea_output <- GSEA(sort(statTest,decreasing = TRUE),
                    TERM2GENE = temp,
                    TERM2NAME = re,
                    seed = TRUE,
                    pvalueCutoff = 1,
                    eps = 1e-100)

gsea_output <- pairwise_termsim(gsea_output,showCategory = 40)
network_plot <- emapplot(gsea_output,cex_label_category = 0.7,showCategory = 40,color="NES") +
        ggtitle(paste0("\n",
                       "Over representation analysis for ",comparisonname))
network_plot

datatable(dplyr::select(gsea_output@result %>% arrange(pvalue),
                                     -leading_edge,
                                     -core_enrichment
  ))
gsea_output@result %>% arrange(pvalue) %>%
   rio::export(file = file.path(outdir,paste0(ComparisonName,"_GSEA.xlsx")))

GSEA analysis of KEGG terms.

Following the tests of differential expression, we now perform a gene set enrichment analysis using the fgsea package to identify GO genesets which are upregulated or downregulated in comparison Cut minus Uncut.

Table 5 and figure 7 show the ranking of the differentially regulated gene sets and the gene set netowrk plots for top 40 differentially regulated by p-value.

For information on using fgsea, visit the package the package home page or our course material here

require(fgsea)
require(dplyr)
require(tibble)
require(magrittr)
require(GO.db)
require(clusterProfiler)
# GOmap <- "~/Desktop/Projects/heintz/monkeyGORefs/MfascIDToGO.txt"
# # DEtable <- read.delim("~/Desktop/Projects/brc/renvTest/AnotherTest2/DE_Genes/salmon/Group_shPTBP1_53_minus_TamDEG.xls")
# DEtable <- read.delim("/Volumes/MRCbackup/eric_mFasc/DE_Genes/Group_contra_ctx_input_minus_contra_ctx_IPDEG.xls")
# annoS <- read.delim("/Volumes/MRCbackup/eric_mFasc/MfascicularisIDtoSymbolforPipe.txt",sep="\t")

temp <- read.delim(KEGGsets,row.names = NULL)
# temp <- merge(temp,annoS,by=1,all=TRUE)

# temp <- temp[!temp$GOIDs == "" & !is.na(temp$Symbols),]
temp <- temp[!temp$Category == "",] %>% 
  dplyr::select(TERM=Category,GENE=Genes)

# mttr <- split(as.vector(temp$Genes), as.vector(temp$Category))
# # mttr <- split(as.vector(temp$Symbols), as.vector(temp$GOIDs))
# 
# mttr <- lapply(mttr,unique)
statTest <- DEtable %>% filter((!is.na(padj))) %>% dplyr::pull(stat)

# names(statTest) <- DEtable %>% filter((!is.na(padj))) %>% .[,2]
names(statTest) <- DEtable %>% filter((!is.na(padj))) %>% .[,1]

re <- as.data.frame(KEGGREST::keggList("pathway")) %>% rownames_to_column("kegg_id") %>% 
  set_colnames(c("KEGGID","TERM")) %>% 
  filter(!duplicated(KEGGID))

temp <- temp[temp[,1] %in% re[,1],]
gsea_output <- GSEA(sort(statTest,decreasing = TRUE),
                    TERM2GENE = temp,
                    TERM2NAME = re,
                    seed = TRUE,
                    pvalueCutoff = 1,
                    eps = 1e-100)
    
gsea_output <- pairwise_termsim(gsea_output,showCategory = 40)
network_plot <- emapplot(gsea_output,cex_label_category = 0.7,showCategory = 40,color="NES") +
        ggtitle(paste0("\n",
                       "Over representation analysis for ",comparisonname))
network_plot

datatable(dplyr::select(gsea_output@result %>% arrange(pvalue),
                                     -leading_edge,
                                     -core_enrichment
  ))
gsea_output@result %>% arrange(pvalue) %>% 
   rio::export(file = file.path(outdir,paste0(ComparisonName,"_KEGG_GSEA.xlsx")))

GSEA analysis of PFAM terms.

Following the tests of differential expression, we now perform a gene set enrichment analysis using the fgsea package to identify GO genesets which are upregulated or downregulated in comparison Cut minus Uncut.

Table 6 and figure 8 show the ranking of the differentially regulated gene sets and the gene set netowrk plots for top 40 differentially regulated by p-value.

For information on using fgsea, visit the package the package home page or our course material here

require(fgsea)
require(dplyr)
require(tibble)
require(magrittr)
require(GO.db)
require(clusterProfiler)
# GOmap <- "~/Desktop/Projects/heintz/monkeyGORefs/MfascIDToGO.txt"
# # DEtable <- read.delim("~/Desktop/Projects/brc/renvTest/AnotherTest2/DE_Genes/salmon/Group_shPTBP1_53_minus_TamDEG.xls")
# DEtable <- read.delim("/Volumes/MRCbackup/eric_mFasc/DE_Genes/Group_contra_ctx_input_minus_contra_ctx_IPDEG.xls")
# annoS <- read.delim("/Volumes/MRCbackup/eric_mFasc/MfascicularisIDtoSymbolforPipe.txt",sep="\t")

temp <- read.delim(PFAMsets,row.names = NULL)
# temp <- merge(temp,annoS,by=1,all=TRUE)

# temp <- temp[!temp$GOIDs == "" & !is.na(temp$Symbols),]
temp <- temp[!temp$Category == "",] %>% 
  dplyr::select(TERM=Category,GENE=Genes)

# mttr <- split(as.vector(temp$Genes), as.vector(temp$Category))
# # mttr <- split(as.vector(temp$Symbols), as.vector(temp$GOIDs))
# 
# mttr <- lapply(mttr,unique)
statTest <- DEtable %>% filter((!is.na(padj))) %>% dplyr::pull(stat)

# names(statTest) <- DEtable %>% filter((!is.na(padj))) %>% .[,2]
names(statTest) <- DEtable %>% filter((!is.na(padj))) %>% .[,1]

# re <- as.data.frame(KEGGREST::keggList("pathway")) %>% rownames_to_column("kegg_id") %>% 
#   set_colnames(c("KEGGID","TERM")) %>% 
#   filter(!duplicated(KEGGID))

gsea_output <- GSEA(sort(statTest,decreasing = TRUE),
                    TERM2GENE = temp,
                    seed = TRUE,
                    pvalueCutoff = 1,
                    eps = 1e-100)
    
gsea_output <- pairwise_termsim(gsea_output,showCategory = 40)
network_plot <- emapplot(gsea_output,cex_label_category = 0.7,showCategory = 40,color="NES") +
        ggtitle(paste0("\n",
                       "Over representation analysis for ",comparisonname))
network_plot

datatable(dplyr::select(gsea_output@result %>% arrange(pvalue),
                                     -leading_edge,
                                     -core_enrichment
  ))
gsea_output@result %>% arrange(pvalue) %>% 
   rio::export(file = file.path(outdir,paste0(ComparisonName,"_PFAM_GSEA.xlsx")))

Glossary of Terms

Return to table of contents

Key terms with Course Links

Software used

Return to table of contents

Packages outside of R

Package Citation
Picard Tools https://broadinstitute.github.io/picard/

R packages

## R version 4.1.2 (2021-11-01)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Catalina 10.15.7
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] pheatmap_1.0.12              org.Dr.eg.db_3.14.0         
##  [3] enrichplot_1.14.2            clusterProfiler_4.2.2       
##  [5] GO.db_3.14.0                 fgsea_1.20.0                
##  [7] plotly_4.10.0                ggrepel_0.9.1               
##  [9] kableExtra_1.3.4             DT_0.22                     
## [11] GlossyBRC_0.1.0              jsonlite_1.8.0              
## [13] rjson_0.2.21                 rio_0.5.29                  
## [15] Rsamtools_2.10.0             Biostrings_2.62.0           
## [17] XVector_0.34.0               tximport_1.22.0             
## [19] IsoformSwitchAnalyzeR_1.16.0 DEXSeq_1.40.0               
## [21] RColorBrewer_1.1-3           DESeq2_1.34.0               
## [23] SummarizedExperiment_1.24.0  MatrixGenerics_1.6.0        
## [25] matrixStats_0.61.0           BiocParallel_1.28.3         
## [27] limma_3.50.1                 GenomicFeatures_1.46.5      
## [29] AnnotationDbi_1.56.2         Biobase_2.54.0              
## [31] GenomicRanges_1.46.1         GenomeInfoDb_1.30.1         
## [33] IRanges_2.28.0               S4Vectors_0.32.3            
## [35] BiocGenerics_0.40.0          forcats_0.5.1               
## [37] stringr_1.4.0                dplyr_1.0.8                 
## [39] purrr_0.3.4                  readr_2.1.2                 
## [41] tidyr_1.2.0                  tibble_3.1.7                
## [43] ggplot2_3.3.5                tidyverse_1.3.1             
## [45] magrittr_2.0.2              
## 
## loaded via a namespace (and not attached):
##   [1] rappdirs_0.3.3                rtracklayer_1.54.0           
##   [3] bit64_4.0.5                   knitr_1.38                   
##   [5] DelayedArray_0.20.0           data.table_1.14.2            
##   [7] hwriter_1.3.2                 KEGGREST_1.34.0              
##   [9] RCurl_1.98-1.6                AnnotationFilter_1.18.0      
##  [11] generics_0.1.2                lambda.r_1.2.4               
##  [13] RSQLite_2.2.10                shadowtext_0.1.2             
##  [15] bit_4.0.4                     tzdb_0.2.0                   
##  [17] webshot_0.5.2                 xml2_1.3.3                   
##  [19] lubridate_1.8.0               httpuv_1.6.5                 
##  [21] assertthat_0.2.1              viridis_0.6.2                
##  [23] xfun_0.39                     hms_1.1.1                    
##  [25] jquerylib_0.1.4               evaluate_0.15                
##  [27] promises_1.2.0.1              fansi_1.0.2                  
##  [29] restfulr_0.0.13               progress_1.2.2               
##  [31] dbplyr_2.1.1                  readxl_1.3.1                 
##  [33] igraph_1.3.0                  DBI_1.1.2                    
##  [35] geneplotter_1.72.0            htmlwidgets_1.5.4            
##  [37] futile.logger_1.4.3           ellipsis_0.3.2               
##  [39] crosstalk_1.2.0               ggnewscale_0.4.7             
##  [41] backports_1.4.1               annotate_1.72.0              
##  [43] biomaRt_2.50.3                vctrs_0.4.1                  
##  [45] ensembldb_2.18.4              cachem_1.0.6                 
##  [47] withr_2.5.0                   ggforce_0.3.3                
##  [49] BSgenome_1.62.0               vroom_1.5.7                  
##  [51] GenomicAlignments_1.30.0      treeio_1.18.1                
##  [53] prettyunits_1.1.1             svglite_2.1.0                
##  [55] DOSE_3.20.1                   ape_5.6-2                    
##  [57] lazyeval_0.2.2                crayon_1.5.0                 
##  [59] genefilter_1.76.0             labeling_0.4.2               
##  [61] edgeR_3.36.0                  pkgconfig_2.0.3              
##  [63] tweenr_1.0.2                  nlme_3.1-153                 
##  [65] ProtGenerics_1.26.0           rlang_1.0.6                  
##  [67] lifecycle_1.0.1               downloader_0.4               
##  [69] filelock_1.0.2                BiocFileCache_2.2.1          
##  [71] modelr_0.1.8                  AnnotationHub_3.2.2          
##  [73] VennDiagram_1.7.3             cellranger_1.1.0             
##  [75] polyclip_1.10-0               Matrix_1.3-4                 
##  [77] aplot_0.1.6                   tximeta_1.12.4               
##  [79] reprex_2.0.1                  png_0.1-7                    
##  [81] viridisLite_0.4.0             bitops_1.0-7                 
##  [83] blob_1.2.2                    qvalue_2.26.0                
##  [85] gridGraphics_0.5-1            scales_1.1.1                 
##  [87] memoise_2.0.1                 plyr_1.8.7                   
##  [89] zlibbioc_1.40.0               compiler_4.1.2               
##  [91] scatterpie_0.1.7              BiocIO_1.4.0                 
##  [93] cli_3.6.0                     patchwork_1.1.1              
##  [95] formatR_1.12                  MASS_7.3-54                  
##  [97] tidyselect_1.1.2              stringi_1.7.6                
##  [99] highr_0.9                     yaml_2.3.5                   
## [101] GOSemSim_2.20.0               locfit_1.5-9.4               
## [103] grid_4.1.2                    sass_0.4.1                   
## [105] fastmatch_1.1-3               tools_4.1.2                  
## [107] parallel_4.1.2                rstudioapi_0.13              
## [109] foreign_0.8-81                gridExtra_2.3                
## [111] farver_2.1.0                  ggraph_2.0.5                 
## [113] digest_0.6.29                 BiocManager_1.30.16          
## [115] shiny_1.7.2                   Rcpp_1.0.8                   
## [117] broom_0.7.12                  BiocVersion_3.14.0           
## [119] later_1.3.0                   httr_1.4.2                   
## [121] colorspace_2.0-3              rvest_1.0.2                  
## [123] XML_3.99-0.8                  fs_1.5.2                     
## [125] splines_4.1.2                 yulab.utils_0.0.4            
## [127] statmod_1.4.36                tidytree_0.3.9               
## [129] graphlayouts_0.8.0            ggplotify_0.1.0              
## [131] systemfonts_1.0.4             xtable_1.8-4                 
## [133] ggtree_3.2.1                  futile.options_1.0.1         
## [135] tidygraph_1.2.0               ggfun_0.0.6                  
## [137] R6_2.5.1                      pillar_1.7.0                 
## [139] htmltools_0.5.2               mime_0.12                    
## [141] DRIMSeq_1.22.0                glue_1.6.2                   
## [143] fastmap_1.1.0                 interactiveDisplayBase_1.32.0
## [145] utf8_1.2.2                    lattice_0.20-45              
## [147] bslib_0.3.1                   curl_4.3.2                   
## [149] zip_2.2.0                     openxlsx_4.2.5               
## [151] survival_3.2-13               rmarkdown_2.13               
## [153] munsell_0.5.0                 DO.db_2.9                    
## [155] GenomeInfoDbData_1.2.7        haven_2.4.3                  
## [157] reshape2_1.4.4                gtable_0.3.0